www.gusucode.com > 7-DOF Robotic Arm Model in MATLAB工具箱matlab源码 > 7-DOF Robotic Arm Model in MATLAB/Dynamic_model_eq.m

    %%Kynematic model Kuka LWR robotic arm
%%Denavit-Hatenberg Parameters
% i  thi  di  ai    alphai
% 1  th1  d1   0     -pi/2  
% 2  th2  0   0     pi/2 
% 3  th3  d2  0     pi/2
% 4  th4  0   0     -pi/2
% 5  th5  d3  0     -pi/2
% 6  th6  0   0     pi/2
% 7  th7  d4   0     0
syms th1 th2 th3 th4 th5 th6 th7 d1 d2 d3 d4;
d1=0.36; d2=0.418; d3=0.4; d4=0.081; %arm architecture (m)


R1z=[cos(th1) -sin(th1) 0 0; sin(th1) cos(th1) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
T1z=[1 0 0 0;0 1 0 0;0 0 1 d1;0 0 0 1]; %Translation in z axis
R1x=[1 0 0 0;0 cos(-pi/2) -sin(-pi/2) 0;0 sin(-pi/2) cos(-pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_0to1=T1z*R1z*R1x;
R2z=[cos(th2) -sin(th2) 0 0; sin(th2) cos(th2) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
R2x=[1 0 0 0;0 cos(pi/2) -sin(pi/2) 0;0 sin(pi/2) cos(pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_1to2=R2z*R2x;
R3z=[cos(th3) -sin(th3) 0 0; sin(th3) cos(th3) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
T3z=[1 0 0 0;0 1 0 0;0 0 1 d2;0 0 0 1]; %Translation in z axis
R3x=[1 0 0 0;0 cos(pi/2) -sin(pi/2) 0;0 sin(pi/2) cos(pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_2to3=T3z*R3z*R3x;
R4z=[cos(th4) -sin(th4) 0 0; sin(th4) cos(th4) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
R4x=[1 0 0 0;0 cos(-pi/2) -sin(-pi/2) 0;0 sin(-pi/2) cos(-pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_3to4=R4z*R4x;
R5z=[cos(th5) -sin(th5) 0 0; sin(th5) cos(th5) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
T5z=[1 0 0 0;0 1 0 0;0 0 1 d3;0 0 0 1]; %Translation in z axis
R5x=[1 0 0 0;0 cos(-pi/2) -sin(-pi/2) 0;0 sin(-pi/2) cos(-pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_4to5=T5z*R5z*R5x;
R6z=[cos(th6) -sin(th6) 0 0; sin(th6) cos(th6) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
R6x=[1 0 0 0;0 cos(pi/2) -sin(pi/2) 0;0 sin(pi/2) cos(pi/2) 0;0 0 0 1]; %Rotation matrix around x axis
A_5to6=R6z*R6x;
R7z=[cos(th7) -sin(th7) 0 0; sin(th7) cos(th7) 0 0;0 0 1 0;0 0 0 1]; %Rotation matrix around z axis
T7z=[1 0 0 0;0 1 0 0;0 0 1 d4;0 0 0 1]; %Translation in z axis
A_6to7=T7z*R7z;

%A_0to7=A_0to1*A_1to2*A_2to3+A_3to4*A_4to5*A_5to6*A_6to7;

%%Dynamic model Kuka LWR robotic arm

A_0to2=A_0to1*A_1to2;
A_0to3=A_0to2*A_2to3;
A_0to4=A_0to3*A_3to4;
A_0to5=A_0to4*A_4to5;
A_0to6=A_0to5*A_5to6;
A_0to7=A_0to6*A_6to7;

A_matrix=[A_0to1 A_0to2 A_0to3 A_0to4 A_0to5 A_0to6 A_0to7];
th_matrix=[th1 th2 th3 th4 th5 th6 th7];

%links specs

%mass in kg of each link
m1=3.4525; m2=3.4821; m3=4.0562; m4=3.4822; m5=2.1633; m6=2.3466; m7=0.31290;
%Position of the center of mass in the DH framework, units in m
r1=[0; -0.03; 0.12; 0]; 
r2=[3.0000e-04; 0.059; 0.042; 0];
r3=[0; 0.03; 0.13; 0];
r4=[0; 0.067; 0.034; 0];
r5=[1.0000e-04; 0.021; 0.076; 0];
r6=[0; 6.0000e-04; 4.0000e-04; 0];
r7=[0; 0; 0.02; 0];
  

   %Uij Matrixes
   U11=diff(A_0to1,th1); U21=diff(A_0to2,th1); U31=diff(A_0to3,th1);
   U12=zeros(4);         U22=diff(A_0to2,th2); U32=diff(A_0to3,th2);
   U13=zeros(4);         U23=zeros(4);         U33=diff(A_0to3,th3);
   U14=zeros(4);         U24=zeros(4);         U34=zeros(4);         
   U15=zeros(4);         U25=zeros(4);         U35=zeros(4);         
   U16=zeros(4);         U26=zeros(4);         U36=zeros(4);         
   U17=zeros(4);         U27=zeros(4);         U37=zeros(4);         
   
   U41=diff(A_0to4,th1); U51=diff(A_0to5,th1); U61=diff(A_0to6,th1);
   U42=diff(A_0to4,th2); U52=diff(A_0to5,th2); U62=diff(A_0to6,th2);
   U43=diff(A_0to4,th3); U53=diff(A_0to5,th3); U63=diff(A_0to6,th3);
   U44=diff(A_0to4,th4); U54=diff(A_0to5,th4); U64=diff(A_0to6,th4);
   U45=zeros(4);         U55=diff(A_0to5,th5); U65=diff(A_0to6,th5);
   U46=zeros(4);         U56=zeros(4);         U66=diff(A_0to6,th6);
   U47=zeros(4);         U57=zeros(4);         U67=zeros(4);
   
   U71=diff(A_0to7,th1);
   U72=diff(A_0to7,th2);
   U73=diff(A_0to7,th3);
   U74=diff(A_0to7,th4);
   U75=diff(A_0to7,th5);
   U76=diff(A_0to7,th6);
   U77=diff(A_0to7,th7);
  
   %Uijk Matrixes
   
   %U1jk Matrixes
   U111=diff(U11,th1); U121=zeros(4)     ; U131=zeros(4);
   U112=zeros(4)     ; U122=zeros(4)     ; U132=zeros(4);
   U113=zeros(4)     ; U123=zeros(4)     ; U133=zeros(4);
   U114=zeros(4)     ; U124=zeros(4)     ; U134=zeros(4);
   U115=zeros(4)     ; U125=zeros(4)     ; U135=zeros(4);
   U116=zeros(4)     ; U126=zeros(4)     ; U136=zeros(4);
   U117=zeros(4)     ; U127=zeros(4)     ; U137=zeros(4);
   
   U141=zeros(4)     ; U151=zeros(4)     ; U161=zeros(4);
   U142=zeros(4)     ; U152=zeros(4)     ; U162=zeros(4);
   U143=zeros(4)     ; U153=zeros(4)     ; U163=zeros(4);
   U144=zeros(4)     ; U154=zeros(4)     ; U164=zeros(4);
   U145=zeros(4)     ; U155=zeros(4)     ; U165=zeros(4);
   U146=zeros(4)     ; U156=zeros(4)     ; U166=zeros(4);
   U147=zeros(4)     ; U157=zeros(4)     ; U167=zeros(4);
   
   U171=zeros(4);
   U172=zeros(4);
   U173=zeros(4);
   U174=zeros(4);
   U175=zeros(4);
   U176=zeros(4);
   U177=zeros(4);
   
   %U2jk Matrixes
   U211=diff(U21,th1); U221=diff(U22,th1); U231=zeros(4);
   U212=diff(U21,th2); U222=diff(U22,th2); U232=zeros(4);
   U213=zeros(4)     ; U223=zeros(4)     ; U233=zeros(4);
   U214=zeros(4)     ; U224=zeros(4)     ; U234=zeros(4);
   U215=zeros(4)     ; U225=zeros(4)     ; U235=zeros(4);
   U216=zeros(4)     ; U226=zeros(4)     ; U236=zeros(4);
   U217=zeros(4)     ; U227=zeros(4)     ; U237=zeros(4);
   
   U241=zeros(4)     ; U251=zeros(4)     ; U261=zeros(4);
   U242=zeros(4)     ; U252=zeros(4)     ; U262=zeros(4);
   U243=zeros(4)     ; U253=zeros(4)     ; U263=zeros(4);
   U244=zeros(4)     ; U254=zeros(4)     ; U264=zeros(4);
   U245=zeros(4)     ; U255=zeros(4)     ; U265=zeros(4);
   U246=zeros(4)     ; U256=zeros(4)     ; U266=zeros(4);
   U247=zeros(4)     ; U257=zeros(4)     ; U267=zeros(4);
   
   U271=zeros(4);
   U272=zeros(4);
   U273=zeros(4);
   U274=zeros(4);
   U275=zeros(4);
   U276=zeros(4);
   U277=zeros(4);
   
   %U3jk Matrixes
   U311=diff(U31,th1); U321=diff(U32,th1); U331=diff(U33,th1);
   U312=diff(U31,th2); U322=diff(U32,th2); U332=diff(U33,th2);
   U313=diff(U31,th3); U323=diff(U32,th3); U333=diff(U33,th3);
   U314=zeros(4)     ; U324=zeros(4)     ; U334=zeros(4);
   U315=zeros(4)     ; U325=zeros(4)     ; U335=zeros(4);
   U316=zeros(4)     ; U326=zeros(4)     ; U336=zeros(4);
   U317=zeros(4)     ; U327=zeros(4)     ; U337=zeros(4);

   U341=zeros(4)     ; U351=zeros(4)     ; U361=zeros(4);
   U342=zeros(4)     ; U352=zeros(4)     ; U362=zeros(4);
   U343=zeros(4)     ; U353=zeros(4)     ; U363=zeros(4);
   U344=zeros(4)     ; U354=zeros(4)     ; U364=zeros(4);
   U345=zeros(4)     ; U355=zeros(4)     ; U365=zeros(4);
   U346=zeros(4)     ; U356=zeros(4)     ; U366=zeros(4);
   U347=zeros(4)     ; U357=zeros(4)     ; U367=zeros(4);
   
   U371=zeros(4);
   U372=zeros(4);
   U373=zeros(4);
   U374=zeros(4);
   U375=zeros(4);
   U376=zeros(4);
   U377=zeros(4);
   
   %U4jk Matrixes
   U411=diff(U41,th1); U421=diff(U42,th1); U431=diff(U43,th1);
   U412=diff(U41,th2); U422=diff(U42,th2); U432=diff(U43,th2);
   U413=diff(U41,th3); U423=diff(U42,th3); U433=diff(U43,th3);
   U414=diff(U41,th4); U424=diff(U42,th4); U434=diff(U43,th4);
   U415=zeros(4);      U425=zeros(4);      U435=zeros(4);
   U416=zeros(4);      U426=zeros(4);      U436=zeros(4);
   U417=zeros(4);      U427=zeros(4);      U437=zeros(4);
   
   U441=diff(U44,th1); U451=zeros(4);      U461=zeros(4);      
   U442=diff(U44,th2); U452=zeros(4);      U462=zeros(4);      
   U443=diff(U44,th3); U453=zeros(4);      U463=zeros(4);      
   U444=diff(U44,th4); U454=zeros(4);      U464=zeros(4);      
   U445=zeros(4);      U455=zeros(4);      U465=zeros(4);      
   U446=zeros(4);      U456=zeros(4);      U466=zeros(4);      
   U447=zeros(4);      U457=zeros(4);      U467=zeros(4);      
   
   U471=zeros(4);      
   U472=zeros(4);      
   U473=zeros(4);      
   U474=zeros(4);      
   U475=zeros(4);  
   U476=zeros(4);      
   U477=zeros(4);      
   
   %U5jk Matrixes
   U511=diff(U51,th1); U521=diff(U52,th1); U531=diff(U53,th1); 
   U512=diff(U51,th2); U522=diff(U52,th2); U532=diff(U53,th2); 
   U513=diff(U51,th3); U523=diff(U52,th3); U533=diff(U53,th3); 
   U514=diff(U51,th4); U524=diff(U52,th4); U534=diff(U53,th4); 
   U515=diff(U51,th5); U525=diff(U52,th5); U535=diff(U53,th5); 
   U516=zeros(4);      U526=zeros(4);      U536=zeros(4);      
   U517=zeros(4);      U527=zeros(4);      U537=zeros(4);      
   
   U541=diff(U54,th1); U551=diff(U55,th1); U561=zeros(4);  
   U542=diff(U54,th2); U552=diff(U55,th2); U562=zeros(4);
   U543=diff(U54,th3); U553=diff(U55,th3); U563=zeros(4);      
   U544=diff(U54,th4); U554=diff(U55,th4); U564=zeros(4);      
   U545=diff(U54,th5); U555=diff(U55,th5); U565=zeros(4);      
   U546=zeros(4);      U556=zeros(4);      U566=zeros(4);      
   U547=zeros(4);      U557=zeros(4);      U567=zeros(4);      
   
   U571=zeros(4); 
   U572=zeros(4); 
   U573=zeros(4); 
   U574=zeros(4); 
   U575=zeros(4); 
   U576=zeros(4); 
   U577=zeros(4); 
   
   %U6jk Matrixes
   U611=diff(U61,th1); U621=diff(U62,th1); U631=diff(U63,th1); 
   U612=diff(U61,th2); U622=diff(U62,th2); U632=diff(U63,th2); 
   U613=diff(U61,th3); U623=diff(U62,th3); U633=diff(U63,th3); 
   U614=diff(U61,th4); U624=diff(U62,th4); U634=diff(U63,th4); 
   U615=diff(U61,th5); U625=diff(U62,th5); U635=diff(U63,th5); 
   U616=diff(U61,th6); U626=diff(U62,th6); U636=diff(U63,th6); 
   U617=zeros(4);      U627=zeros(4);      U637=zeros(4);
   
   U641=diff(U64,th1); U651=diff(U65,th1); U661=diff(U66,th1); 
   U642=diff(U64,th2); U652=diff(U65,th2); U662=diff(U66,th2);
   U643=diff(U64,th3); U653=diff(U65,th3); U663=diff(U66,th3);
   U644=diff(U64,th4); U654=diff(U65,th4); U664=diff(U66,th4);
   U645=diff(U64,th5); U655=diff(U65,th5); U665=diff(U66,th5);
   U646=diff(U64,th6); U656=diff(U65,th6); U666=diff(U66,th6);
   U647=zeros(4);      U657=zeros(4);      U667=zeros(4);     
    
   U671=zeros(4);
   U672=zeros(4);
   U673=zeros(4);
   U674=zeros(4);
   U675=zeros(4);
   U676=zeros(4);
   U677=zeros(4);
   
   %U7jk Matrixes
   
   U711=diff(U71,th1); U721=diff(U72,th1); U731=diff(U73,th1); 
   U712=diff(U71,th2); U722=diff(U72,th2); U732=diff(U73,th2); 
   U713=diff(U71,th3); U723=diff(U72,th3); U733=diff(U73,th3); 
   U714=diff(U71,th4); U724=diff(U72,th4); U734=diff(U73,th4); 
   U715=diff(U71,th5); U725=diff(U72,th5); U735=diff(U73,th5); 
   U716=diff(U71,th6); U726=diff(U72,th6); U736=diff(U73,th6); 
   U717=diff(U71,th7); U727=diff(U72,th7); U737=diff(U73,th7); 
   
   U741=diff(U74,th1); U751=diff(U75,th1); U761=diff(U76,th1); 
   U742=diff(U74,th2); U752=diff(U75,th2); U762=diff(U76,th2); 
   U743=diff(U74,th3); U753=diff(U75,th3); U763=diff(U76,th3); 
   U744=diff(U74,th4); U754=diff(U75,th4); U764=diff(U76,th4); 
   U745=diff(U74,th5); U755=diff(U75,th5); U765=diff(U76,th5); 
   U746=diff(U74,th6); U756=diff(U75,th6); U766=diff(U76,th6); 
   U747=diff(U74,th7); U757=diff(U75,th7); U767=diff(U76,th7); 
   
   U771=diff(U77,th1); 
   U772=diff(U77,th2); 
   U773=diff(U77,th3); 
   U774=diff(U77,th4); 
   U775=diff(U77,th5); 
   U776=diff(U77,th6); 
   U777=diff(U77,th7); 
   
   %I matrixes
   
   I1=[0.0747 0.0085 0;
      0.0085 0.0574 0;
      0 0 0.0239];
  
  I2=[0.0390 -0.0086 -0.0037;
    -0.0086 0.0279 -6.1633e-05;
    -0.0037 -6.1633e-05 0.0199];

  I3=[0.006052050623697 0.000000262383560 0.000001120384479;
     0.000000262383560 0.005990028254028 -0.001308542301422;
    0.000001120384479 -0.001308542301422 0.001861529721327];
 
  I4=[0.006052050623697 -0.000000262507583 -0.000001120888863;
      -0.000000262507583 0.005990028254028 -0.001308542301422;
     -0.000001120888863 -0.001308542301422 0.001861529721327];

  I5=[0.005775526977146 -0.000000448127278 0.000000782342032;
      -0.000000448127278 0.005348473437925 0.001819965983941;
      0.000000782342032 0.001819965983941 0.002181233531810];

  I6=[0.001882302441080 0.000000003150206 -0.000000072256604;
      0.000000003150206 0.001889339660303 -0.000012066987492;
     -0.000000072256604 -0.000012066987492 0.002133520179065];

  I7=[0.0003390625 0 0;
      0 0.0003390625 0;
      0 0 0.000528125];
  
  %J matrix
  
  I=zeros(4);
  for i=1:7
      I=eval(['I' num2str(i)]);
      m=eval(['m' num2str(i)]);
      r=eval(['r' num2str(i)]);
      eval(['j11' '=((-I(1,1)+I(2,2)+I(3,3))/2)']);
      eval(['j12' '=I(1,2)']);
      eval(['j13' '=I(1,3)']);
      eval(['j14' '=m*r(1)']);
      
      eval(['j21' '=I(1,2)']);
      eval(['j22' '=((I(1,1)-I(2,2)+I(3,3))/2)']);
      eval(['j23' '=I(2,3)']);
      eval(['j24' '=m*r(2)']);
      
      eval(['j31' '=I(1,3)']);
      eval(['j32' '=I(2,3)']);
      eval(['j33' '=((I(1,1)+I(2,2)-I(3,3))/2)']);
      eval(['j34' '=m*r(3)']);
      
      eval(['j41' '=m*r(1)']);
      eval(['j42' '=m*r(2)']);
      eval(['j43' '=m*r(3)']);
      eval(['j44' '=m']);
      
      J=[j11 j12 j13 j14;j21 j22 j23 j24; j31 j32 j33 j34;j41 j42 j43 j44];
      eval(['J' num2str(i) '=J']);
  end
  
  
  %D matrix
  
  Uaux=zeros(4);
for i=1:7
   for j=1:7
       m=max([i j]);
       x=1;
       for k=m:7
       Uaux=eval(['U' num2str(k) num2str(i)]);
       Ud=Uaux';
       A=eval(['U' num2str(k) num2str(j)])*eval(['J' num2str(k)])*Ud;
       x=x+trace(A);
       end
       eval(['d' num2str(i) num2str(j) '=x']);
   end
end

D=[d11 d12 d13 d14 d15 d16 d17;
   d21 d22 d23 d24 d25 d26 d27;
   d31 d32 d33 d34 d35 d36 d37;
   d41 d33 d43 d44 d45 d46 d47;
   d51 d52 d53 d54 d55 d56 d57;
   d61 d62 d63 d64 d65 d66 d67;
   d71 d72 d73 d74 d75 d76 d77];

%Hikm matrix
  for i=1:7
   for k=1:7
     for m=1:7
       j=max([i m k]);
       x=0;
       for l=j:7
       Uaux=eval(['U' num2str(j) num2str(i)]);
       Uh=Uaux';
       x=x+trace(eval(['U' num2str(j) num2str(k) num2str(m)])*eval(['J' num2str(j)])*Uh);
       end
       eval(['h' num2str(i) num2str(k) num2str(m) '=x']);
     end 
   end
  end
  
  
  %Coriolis column matrix
 syms dth1 dth2 dth3 dth4 dth5 dth6 dth7 
 
  for i=1:7
      y=0;
      for k=1:7 
        y=y+x;
        x=0;  
          for m=1:7
          y=x+eval(['h' num2str(i) num2str(k) num2str(m)])*eval(['dth' num2str(k)])*eval(['dth' num2str(m)]);
          end    
      end
      eval(['h' num2str(i) '=y']);
  end
  
  H=[h1;h2;h3;h4;h5;h6;h7];
  
  %Gravity column matrix
  
  g=[0 0 -9.81 0];
  
  for i=1:7
      x=0;
      for j=i:7
      x=x+(-eval(['m' num2str(j)])*g*eval(['U' num2str(j) num2str(i)])*eval(['r' num2str(j)]));  
      end
      eval(['c' num2str(i) '=x']);
  end
   
  C=[c1;c2;c3;c4;c5;c6;c7];
  
  %Final dynamic model
  
  %angular acceleration matrix
  
  syms ddth1 ddth2 ddth3 ddth4 ddth5 ddth6 ddth7
  ddth=[ddth1;ddth2;ddth3;ddth4;ddth5;ddth6;ddth7]; 
  %T=[t1;t2;t3;t4;t5;t6;t7]; %Matrix with torques of each joint
  
  T=D*ddth+H+C;